package com.bestcem.xm.user.service;

import com.bestcem.xm.common.core.domain.web.ServiceResult;
import com.bestcem.xm.user.enums.RolePermsEnum;
import com.bestcem.xm.user.service.dto.group.IdRelationDTO;
import com.bestcem.xm.user.service.dto.role.GetAccountRoleDTO;
import com.bestcem.xm.user.service.dto.role.RoleListDTO;
import com.bestcem.xm.user.service.dto.role.UpdateRoleDTO;
import com.bestcem.xm.user.service.dto.role.UserRoleDTO;
import com.bestcem.xm.user.service.dto.user.OrganizationDTO;

import java.util.List;

/**
 * 角色 service
 *
 * @author wangyunyun <yunyun.wang@idiaoyan.com>
 * @version v1.0
 * @date 2022/3/14 13:18
 */
public interface RoleService {

    /**
     * 获取系统管理员角色id
     *
     * @param orgId 公司id
     * @return ServiceResult<String>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/14 13:24
     */
    ServiceResult<String> getAdminRole(String orgId);

    /**
     * 获取高级管理员角色id
     *
     * @param orgId 公司id
     * @return ServiceResult<String>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/14 13:27
     */
    ServiceResult<String> getSeniorAdminRole(String orgId);

    /**
     * 获取投放审核角色id
     *
     * @param orgId 公司id
     * @return ServiceResult<String>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/18 13:42
     */
    ServiceResult<String> getDeliverCheckRole(String orgId);

    /**
     * 根据orgId获取角色列表
     *
     * @param orgId
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.role.RoleListDTO>>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/15 19:03
     */
    ServiceResult<List<RoleListDTO>> getRoleListByOrgId(String orgId);

    /**
     * 保存角色
     *
     * @param saveRoleDTO
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/16 11:51
     */
    ServiceResult<String> saveUserRole(UserRoleDTO saveRoleDTO);

    /**
     * 保存角色基础方法
     *
     * @param saveRoleDTO
     * @return com.bestcem.xm.util.ServiceResult<java.lang.String>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/16 15:17
     */
    ServiceResult<String> saveUserRoleBase(UserRoleDTO saveRoleDTO);

    /**
     * 更新角色基础方法
     *
     * @param updateRoleDTO
     * @return com.bestcem.xm.util.ServiceResult<java.lang.String>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/16 15:17
     */
    ServiceResult<Integer> updateUserRoleBase(UserRoleDTO updateRoleDTO);

    /**
     * 获取角色关联用户总数
     *
     * @param roleId
     * @param orgId
     * @param userId
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Integer>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/16 17:12
     */
    ServiceResult<List<GetAccountRoleDTO>> getAccountRoleCount(String roleId, String orgId, String userId);

    /**
     * 更新角色
     *
     * @param roleDTO
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Integer>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/16 17:50
     */
    ServiceResult<Integer> updateUserRole(UpdateRoleDTO roleDTO);

    /**
     * 删除角色
     *
     * @param orgId  公司id
     * @param roleId roleId
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Integer>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/16 17:50
     */
    ServiceResult<Integer> deleteUserRole(String orgId, String roleId);

    /**
     * 通过条件查询角色
     *
     * @param userRoleDTO 用户与角色关联dto
     * @return ServiceResult<List < UserRoleDTO>>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/16 15:43
     */
    ServiceResult<List<UserRoleDTO>> selectByCondition(UserRoleDTO userRoleDTO);

    /**
     * 角色 copySample
     *
     * @param srcOrgId 源公司id
     * @param dstOrg   目标公司id
     * @return ServiceResult<String>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/16 13:31
     */
    ServiceResult<String> copySample(String srcOrgId, OrganizationDTO dstOrg);

    /**
     * 创建系统管理员角色和对应的权限
     *
     * @param organizationDTO 公司dto
     * @return ServiceResult<String>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/16 16:42
     */
    ServiceResult<UserRoleDTO> createAdminRole(OrganizationDTO organizationDTO);


    /**
     * 复制旧公司的Role
     *
     * @param srcId 旧公司id
     * @param dstId 新公司id
     * @return List<IdMapNodeDTO>
     * @author yanjishuo <jishuo.yan@idiaoyan.com>
     * @date 2022/03/17 15:06
     */
    ServiceResult<List<IdRelationDTO>> listSampleRoleIds(String srcId, String dstId);

    /**
     * 创建系统内置的投放审核角色
     *
     * @param orgId
     * @return ServiceResult<UserRoleDTO>
     * @author yanjishuo <jishuo.yan@idiaoyan.com>
     * @date 2022/3/18 11:10
     */
    ServiceResult<UserRoleDTO> createDeliverCheckRole(String orgId);

    /**
     * 通过条件查询角色id
     *
     * @param userRoleDTO 用户与角色关联dto
     * @return ServiceResult<String>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/18 14:14
     */
    ServiceResult<List<String>> findRoleIdByCondition(UserRoleDTO userRoleDTO);

    /**
     * 通过角色名称重置角色权限
     *
     * @param roleName 角色名称
     * @return ServiceResult<Void>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/18 19:10
     */
    ServiceResult<Void> resetRolePerms(String roleName);

    /**
     * 重置系统管理员和高级管理员的权限
     *
     * @return ServiceResult<Void>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/21 10:30
     */
    ServiceResult<Void> resetAdminAndSeniorRole();

    /**
     * 创建或更新特殊角色和对应的权限
     *
     * @param orgId         公司id
     * @param rolePermsEnum 角色权限枚举
     * @return ServiceResult<UserRoleDTO>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/18 19:09
     */
    ServiceResult<UserRoleDTO> createOrUpdateRoleAndPerms(String orgId, RolePermsEnum rolePermsEnum);


    /**
     * 判断角色是否存在 如果不存在则保存
     * 返回角色id列表
     *
     * @param orgId    公司id
     * @param nameList 角色名称列表
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < java.lang.String>>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/18 18:04
     */
    ServiceResult<List<String>> checkRoleExistAndSave(String orgId, List<String> nameList);

    /**
     * 根据角色id列表查询角色列表
     *
     * @param roleIdList
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.role.UserRoleDTO>>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/06/13 17:31
     */
    ServiceResult<List<UserRoleDTO>> getRoleListByIdList(List<String> roleIdList);
}
